#include "../mt.h"

void Error(const char* msg)
{
	perror(msg);
	exit(1);
}

int main()
{
	int server_sock, client_sock;
	struct sockaddr_in server_addr, client_addr;
	char buf[MAX_MSG_LENGTH]; memset(buf,0,MAX_MSG_LENGTH);
	FILE* pipe;
	
	/* Crear socket sobre el que se lee: dominio INET, protocolo TCP (STREAM). */
	server_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (server_sock < 0) {
		perror("abriendo socket");
		exit(1);
	}
	
	/* Crear nombre, usamos INADDR_ANY para indicar que cualquiera puede enviar aquí. */
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = INADDR_ANY;
	server_addr.sin_port = htons(PORT);
	if (bind(server_sock, (void*) &server_addr, sizeof(server_addr))) {
		perror("binding datagram socket");
		exit(1);
	}

	// esperamos al cliente y lo aceptamos

	listen(server_sock,1);
	socklen_t client_size = sizeof(client_addr);
	
	client_sock = accept(server_sock,(struct sockaddr *)&client_addr,&client_size);
	if (client_sock<0)
		Error("Error aceptando cliente");
	
	/* Recibimos mensajes hasta que alguno sea el que marca el final. */
	for (;;) {

		// RECIBIENDO COMANDO
		
		ssize_t size = read(client_sock, buf, MAX_MSG_LENGTH);
		
		if (strncmp(buf, END_STRING, MAX_MSG_LENGTH) == 0)
			break;

		/* Agrego redirijo la salida de error a la standar para que tambien la mande */

		int len = strlen(buf);
		buf[len-1] = 0;
		strcat(buf," 2>&1\n");
		printf("Comando(%d): %s", size, buf);

		// EJECUTANDO

		pipe = popen(buf,"r");
		memset(buf,0,size);

		// LEYENDO RESPUESTA

		fread(buf,size,MAX_MSG_LENGTH,pipe);
		//read((int)pipe,buf,MAX_MSG_LENGTH);
		//printf("respuesta:\n%s",buf);

		// ENVIANDO RESPUESTA

		size=sendto(client_sock,buf,strlen(buf),0,(const struct sockaddr*)&client_addr,client_size);

		if( size==-1 ) Error("Error enviando mensaje");
		else memset(buf,0,size);
	}
	
	/* Cerrar socket de recepción. */
	close(server_sock);
	return 0;
}

